home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / isofilt.m < prev    next >
Text File  |  1997-10-26  |  8KB  |  264 lines

  1. MODULE IsoFilt;
  2.  
  3. (*$R-,S-,J+*)
  4. (* Purpose of module: Change MIME text encoding to Atari special characters
  5.  *)
  6. (*$E MTP *)
  7. FROM SYSTEM IMPORT BYTE;
  8. IMPORT GEMDOSIO, InOut;
  9.  
  10.  
  11. IMPORT FileNames, Strings, StrConv, WildCards;
  12.  
  13. IMPORT mtCommand, mtTextfiles, MagicStrings, MagicSys, MagicDOS;
  14.  
  15. TYPE tTranslationTable = ARRAY [128..255] OF BYTE;
  16.  
  17. /* Conversion table from `latin1' charset to `atarist' charset.
  18.    Generated mechanically by GNU recode 3.4.
  19.  
  20.    The recoding should be reversible.
  21. */
  22.  
  23. unsigned char const latin1_to_atarist[256] =
  24.   {
  25.       0,   1,   2,   3,   4,   5,   6,   7, /*   0 -   7 */
  26.       8,   9,  10,  11,  12,  13,  14,  15, /*   8 -  15 */
  27.      16,  17,  18,  19,  20,  21,  22,  23, /*  16 -  23 */
  28.      24,  25,  26,  27,  28,  29,  30,  31, /*  24 -  31 */
  29.      32,  33,  34,  35,  36,  37,  38,  39, /*  32 -  39 */
  30.      40,  41,  42,  43,  44,  45,  46,  47, /*  40 -  47 */
  31.      48,  49,  50,  51,  52,  53,  54,  55, /*  48 -  55 */
  32.      56,  57,  58,  59,  60,  61,  62,  63, /*  56 -  63 */
  33.      64,  65,  66,  67,  68,  69,  70,  71, /*  64 -  71 */
  34.      72,  73,  74,  75,  76,  77,  78,  79, /*  72 -  79 */
  35.      80,  81,  82,  83,  84,  85,  86,  87, /*  80 -  87 */
  36.      88,  89,  90,  91,  92,  93,  94,  95, /*  88 -  95 */
  37.      96,  97,  98,  99, 100, 101, 102, 103, /*  96 - 103 */
  38.     104, 105, 106, 107, 108, 109, 110, 111, /* 104 - 111 */
  39.     112, 113, 114, 115, 116, 117, 118, 119, /* 112 - 119 */
  40.     120, 121, 122, 123, 124, 125, 126, 127, /* 120 - 127 */
  41.     199, 252, 233, 226, 228, 224, 229, 231, /* 128 - 135 */
  42.     234, 235, 232, 239, 238, 236, 196, 197, /* 136 - 143 */
  43.     201, 230, 198, 244, 247, 242, 251, 249, /* 144 - 151 */
  44.     187, 214, 220, 243, 195, 209, 223, 159, /* 152 - 159 */
  45.     225, 173, 155, 156, 245, 157, 192, 221, /* 160 - 167 */
  46.     185, 189, 166, 174, 170, 237, 190, 255, /* 168 - 175 */
  47.     248, 241, 253, 254, 186, 230, 188, 249, /* 176 - 183 */
  48.     213, 191, 167, 175, 172, 171, 169, 168, /* 184 - 191 */
  49.     182, 193, 194, 183, 142, 143, 146, 128, /* 192 - 199 */
  50.     200, 144, 202, 203, 204, 205, 206, 207, /* 200 - 207 */
  51.     208, 165, 210, 211, 212, 184, 153, 215, /* 208 - 215 */
  52.     178, 217, 218, 219, 154, 180, 222, 158, /* 216 - 223 */
  53.     133, 160, 131, 176, 132, 134, 145, 135, /* 224 - 231 */
  54.     138, 130, 136, 137, 141, 161, 140, 139, /* 232 - 239 */
  55.     240, 164, 149, 162, 147, 177, 148, 246, /* 240 - 247 */
  56.     179, 151, 163, 150, 129, 216, 248, 152, /* 248 - 255 */
  57.   };
  58.  
  59. CONST isoTable =  tTranslationTable {
  60.        128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  61.        144,145,146,147,148,149,150,151,152,153,154,155,156,157,225,159,
  62.         32,173,155,156,120,157,124,221, 34, 67,166,174,170, 45, 82,223,
  63.        248,241,253,252, 39,230,227,249, 44, 49,167,175,172,171, 47,168,
  64.        133,160,131, 65,142,143,146,128,138,144,136,137,141,161,140,139,
  65.         68,165,149,162,147,111,153,120,237,151,163,150,154,121, 80,225,
  66.        133,160,131, 97,132,134,145,135,138,130,136,137,141,161,140,139,
  67.        100,164,149,162,147,111,148,246,237,151,163,150,129,121,112,152};
  68.  
  69.  
  70. TYPE
  71.  
  72.   ASCII  = SET OF [0C..377C];
  73.  
  74. CONST
  75.  
  76.   HexDigits= ASCII {'0'..'9','A'..'F'};(* Alle hexadez. Ziffern *)
  77.  
  78. VAR inOpen,
  79.     outOpen : BOOLEAN;
  80.     in,
  81.     out     : mtTextfiles.TEXTFILE;
  82.     charsChanged,
  83.     headLinesChanged : LONGCARD;
  84.  
  85. PROCEDURE CloseIt ();
  86. BEGIN
  87.   IF inOpen THEN mtTextfiles.CloseTextfile (in) END;
  88.   IF outOpen THEN mtTextfiles.CloseTextfile (out) END;
  89. END CloseIt;
  90.  
  91. PROCEDURE error (REF s : ARRAY OF CHAR);
  92. BEGIN
  93.   InOut.WriteString ("isofilt: ");
  94.   InOut.WriteString (s);
  95.   InOut.WriteLn;
  96.   CloseIt();
  97.   MagicSys.Terminate (1);
  98. END error;
  99.  
  100. PROCEDURE Usage ();
  101.   VAR str: Strings.String;
  102. BEGIN
  103.   InOut.WriteString ("Usage: ");
  104.   IF mtCommand.ArgV()
  105.   THEN
  106.     mtCommand.ParamString (0, str);
  107.     InOut.WriteString (str);
  108.   ELSE
  109.     InOut.WriteString ("isofilt");
  110.   END;
  111.   InOut.WriteString (" inputfile outputfile");
  112.   InOut.WriteLn;
  113.   CloseIt();
  114.   MagicSys.Terminate (2);
  115. END Usage;
  116.  
  117. PROCEDURE GetChar (val: INTEGER; VAR ch: ARRAY OF CHAR);
  118. BEGIN
  119.   IF val > 127
  120.   THEN
  121.     ch[0] := CHAR(isoTable[val]);
  122.   ELSE
  123.     ch[0] := CHR(val);
  124.   END;
  125.   IF HIGH(ch) > 0
  126.   THEN
  127.     ch[1] := 0C;
  128.   END;
  129. END GetChar;
  130.  
  131. PROCEDURE CheckId (VAR line: ARRAY OF CHAR): BOOLEAN;
  132. BEGIN
  133.   (* Gibt zurck, ob es sich um eine normale Nachricht oder um einen 
  134.    * Kontrollblock (Infofile etc.) handelt.
  135.    *)
  136.   RETURN Strings.Pos ('@', line, 1) > 0;
  137. END CheckId; 
  138.  
  139. PROCEDURE CheckTextLine (VAR line: ARRAY OF CHAR);
  140.   VAR p, p2 : INTEGER;
  141.       num   : ARRAY [0..3] OF CHAR;
  142.       succ  : BOOLEAN;
  143.       val   : INTEGER;
  144.       start : CARDINAL;
  145. BEGIN
  146.   p := -1;
  147.   REPEAT
  148.     p := Strings.Pos ("=", line, p+1);
  149.     IF p >= 0
  150.     THEN
  151.       Strings.Copy (line, p+1, 2, num, succ);
  152.       IF (num[0] IN HexDigits) & (num[1] IN HexDigits)
  153.       THEN
  154.         Strings.Insert ("$", 0, num, succ);
  155.         start := 0;
  156.         val := StrConv.StrToInt (num, start, succ);
  157.         IF succ & (val >= 32)
  158.         THEN
  159.           Strings.Delete (line, p, 3, succ);
  160.           GetChar (val, num);
  161.           Strings.Insert (num, p, line, succ);
  162.           INC (charsChanged);
  163.         END;
  164.       END;
  165.     END;
  166.   UNTIL p < 0;
  167. END CheckTextLine;
  168.  
  169. PROCEDURE CheckHeadLine (VAR line: ARRAY OF CHAR);
  170.   VAR charSet : Strings.String;
  171.       succ    : BOOLEAN;
  172.       p, p2   : INTEGER;
  173. BEGIN
  174.   IF WildCards.NameMatching (line, "*=\?[iI]*\?=")
  175.   THEN
  176.     (* Enth„lt =?irgendwas?=, also wahrscheinlich ISO-Umlaute *)
  177.     p := Strings.Pos ("=?", line, 1);
  178.     IF p < 0 THEN RETURN END;
  179.     (* Zwischen dem ersten Fragezeichen und dem zweiten steht der Name des
  180.      * Zeichensatzes, extrahieren wir mal, werten wir aber noch nicht weiter aus
  181.      *)
  182.     p2 := Strings.Pos ("?", line, p+2);
  183.     IF p2 < 0 THEN RETURN END;
  184.     IF (line[p2+1] # 'Q') OR (line[p2+2] # '?') THEN RETURN END;
  185.     Strings.Copy (line, p+2, p2-p-2, charSet, succ);
  186.     Strings.Delete (line, p, p2-p+3, succ);
  187.     (* Jetzt noch ?= am Ende suchen und entfernen *)
  188.     p2 := Strings.Pos ("?=", line, p+1);
  189.     IF p2 < 0 THEN RETURN END;
  190.     Strings.Delete (line, p2, 2, succ);
  191.     (* Und jetzt noch alle anderen Zeichen wandeln *)
  192.     INC (headLinesChanged);
  193.     CheckTextLine (line);
  194.   END;
  195. END CheckHeadLine;
  196.  
  197. VAR outf,
  198.     tmpf : ARRAY [0..255] OF CHAR;
  199.     line : ARRAY [0..32766] OF CHAR; 
  200.     inNormalMessage: BOOLEAN;
  201. BEGIN
  202.   inOpen:= FALSE;
  203.   outOpen := FALSE;
  204.   charsChanged := 0;
  205.   headLinesChanged := 0;
  206.   IF mtCommand.ParamCount() # 1
  207.   THEN
  208.     Usage();
  209.   END;
  210.   mtCommand.ParamString (1, outf);
  211.   (* tempor„ren Namen basteln *)
  212.   FileNames.ConcatName (outf, ".TMP", tmpf);
  213.   IF ~mtTextfiles.OpenTextfile (outf, mtTextfiles.READ, 32000, in)
  214.   THEN
  215.     error ("Kann Eingabedatei nicht ”ffnen!");
  216.   END;
  217.   inOpen := TRUE;
  218.   (* tempor„res File ”ffnen *)
  219.   IF ~mtTextfiles.OpenTextfile (tmpf, mtTextfiles.WRITE, 32000, out)
  220.   THEN
  221.     error ("Kann tempor„re Datei nicht anlegen!");
  222.   END;
  223.   outOpen := TRUE;
  224.   (* Jetzt sind beide Dateien offen, also loslegen *)
  225.   inNormalMessage := FALSE;
  226.   WHILE ~mtTextfiles.EndofText (in) DO
  227.     mtTextfiles.ReadLine (in, line);
  228.     mtTextfiles.ReadLn (in);
  229.     CASE line[0] OF
  230.       'W',
  231.       'N',
  232.       'V'   : CheckHeadLine (line); |
  233.       '#'   : inNormalMessage := CheckId (line); |
  234.       ':'   : IF inNormalMessage
  235.               THEN
  236.                 CheckTextLine (line); 
  237.               END; |
  238.     ELSE
  239.     END;
  240.     mtTextfiles.WriteLine (out, line);
  241.     mtTextfiles.WriteLn (out);
  242.   END;
  243.   mtTextfiles.CloseTextfile (in);
  244.   mtTextfiles.CloseTextfile (out);
  245.   inOpen:= FALSE;
  246.   outOpen := FALSE;
  247.   (* Jetzt OUTFILE.TXT l”schen und tmp-Datei umbenennen *)
  248.   IF ~MagicDOS.Fdelete (outf) THEN 
  249.     error ("Kann OUTFILE.TXT nicht l”schen!");
  250.   END;
  251.   IF MagicDOS.Frename (tmpf, outf) # 0
  252.   THEN
  253.     error ("Kann OUTFILE.TMP nicht zu OUTFILE.TXT umbenennen!");
  254.   END;
  255.   InOut.WriteString ("ISO-Filterung erfolgreich durchgefhrt.");
  256.   InOut.WriteLn;
  257.   InOut.WriteCard (headLinesChanged, 0);
  258.   InOut.WriteString (" Headerzeilen ge„ndert und ");
  259.   InOut.WriteCard (charsChanged,0);
  260.   InOut.WriteString (" Zeichen umgesetzt.");
  261.   InOut.WriteLn;
  262.   MagicSys.Terminate (0);
  263. END IsoFilt.
  264.